package zy.blue7.reactor;

import reactor.core.publisher.Flux;

import java.time.Duration;
import java.time.temporal.ChronoUnit;
import java.util.concurrent.TimeUnit;

/**
 * @author blue7
 * @version 1.0
 * @date 2021/8/4 17:22
 */
public class FluxLearn {

    public static void main(String[] args) throws Exception {
//        createFlue();
        Flux.interval(Duration.of(2, ChronoUnit.SECONDS)).subscribe(System.out::println);
        TimeUnit.SECONDS.sleep(5);
    }

    /**
     * 创建 flux 的几种 方法
     */
    public static void createFlue() throws Exception {
        /**
         * todo  不调用 subscribe 方法，是不会执行具体的操作的
         */

        // 1 just()：可以指定序列中包含的全部元素
        // 创建出来的 Flux 序列在发布这些元素之后会自动结束
        Flux.just("1", "2", "3").subscribe(System.out::println);
        // 2 fromArray()，fromIterable()和 fromStream():
        // 可以从一个数组、Iterable 对象或 Stream 对象中创建 Flux 对象
        Flux.fromArray(new Integer[]{4, 5, 6}).subscribe(System.out::println);
        // 3 empty()：创建一个不包含任何元素，只发布结束消息的序列
        Flux.empty().subscribe(System.out::println);
        // 4 range(int start, int count)：
        // 创建包含从 start 起始的 count 个数量的 Integer 对象的序列。
        Flux.range(7, 3).subscribe(System.out::println);
        // 5 interval(Duration period)和 interval(Duration delay, Duration period)：
        // 创建一个包含了从 0 开始递增的 Long 对象的序列。其中包含的元素按照指定的间隔来发布。除了间隔时间之外，
        // 还可以指定起始元素发布之前的延迟时间
        // 每2秒产生一个元素
        Flux.interval(Duration.of(2, ChronoUnit.SECONDS)).subscribe(System.out::println);
        // 每1000微秒产生一个元素
//        Flux.intervalMillis(1000).subscribe(System.out::println);
        TimeUnit.SECONDS.sleep(5);

    }
}
